/**
 * 数据导出工具类
 */

// 导出格式类型
export type ExportFormat = 'csv' | 'excel' | 'json'

// 导出配置接口
export interface ExportConfig {
  filename?: string
  format?: ExportFormat
  headers?: string[]
  fields?: string[]
}

/**
 * 将数据导出为CSV格式
 */
export function exportToCSV(data: any[], config: ExportConfig = {}) {
  const {
    filename = 'export_data',
    headers = [],
    fields = []
  } = config

  if (!data || data.length === 0) {
    throw new Error('没有可导出的数据')
  }

  // 如果没有指定字段，使用第一行数据的所有键
  const exportFields = fields.length > 0 ? fields : Object.keys(data[0])
  
  // 如果没有指定表头，使用字段名
  const exportHeaders = headers.length > 0 ? headers : exportFields

  // 构建CSV内容
  const csvContent = [
    // 表头
    exportHeaders.join(','),
    // 数据行
    ...data.map(row => 
      exportFields.map(field => {
        const value = row[field] || ''
        // 处理包含逗号、引号或换行符的值
        if (typeof value === 'string' && (value.includes(',') || value.includes('"') || value.includes('\n'))) {
          return `"${value.replace(/"/g, '""')}"`
        }
        return value
      }).join(',')
    )
  ].join('\n')

  // 添加BOM以支持中文
  const BOM = '\uFEFF'
  const blob = new Blob([BOM + csvContent], { type: 'text/csv;charset=utf-8;' })
  
  downloadBlob(blob, `${filename}.csv`)
}

/**
 * 将数据导出为JSON格式
 */
export function exportToJSON(data: any[], config: ExportConfig = {}) {
  const { filename = 'export_data', fields = [] } = config

  if (!data || data.length === 0) {
    throw new Error('没有可导出的数据')
  }

  // 如果指定了字段，只导出指定字段
  let exportData = data
  if (fields.length > 0) {
    exportData = data.map(item => {
      const filteredItem: any = {}
      fields.forEach(field => {
        if (item.hasOwnProperty(field)) {
          filteredItem[field] = item[field]
        }
      })
      return filteredItem
    })
  }

  const jsonContent = JSON.stringify(exportData, null, 2)
  const blob = new Blob([jsonContent], { type: 'application/json;charset=utf-8;' })
  
  downloadBlob(blob, `${filename}.json`)
}

/**
 * 将数据导出为Excel格式（简单的HTML表格格式）
 */
export function exportToExcel(data: any[], config: ExportConfig = {}) {
  const {
    filename = 'export_data',
    headers = [],
    fields = []
  } = config

  if (!data || data.length === 0) {
    throw new Error('没有可导出的数据')
  }

  // 如果没有指定字段，使用第一行数据的所有键
  const exportFields = fields.length > 0 ? fields : Object.keys(data[0])
  
  // 如果没有指定表头，使用字段名
  const exportHeaders = headers.length > 0 ? headers : exportFields

  // 构建HTML表格
  const htmlContent = `
    <html>
      <head>
        <meta charset="utf-8">
        <style>
          table { border-collapse: collapse; width: 100%; }
          th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
          th { background-color: #f2f2f2; font-weight: bold; }
        </style>
      </head>
      <body>
        <table>
          <thead>
            <tr>
              ${exportHeaders.map(header => `<th>${header}</th>`).join('')}
            </tr>
          </thead>
          <tbody>
            ${data.map(row => `
              <tr>
                ${exportFields.map(field => `<td>${row[field] || ''}</td>`).join('')}
              </tr>
            `).join('')}
          </tbody>
        </table>
      </body>
    </html>
  `

  const blob = new Blob([htmlContent], { type: 'application/vnd.ms-excel;charset=utf-8;' })
  downloadBlob(blob, `${filename}.xls`)
}

/**
 * 通用导出函数
 */
export function exportData(data: any[], config: ExportConfig = {}) {
  const { format = 'csv' } = config

  switch (format) {
    case 'csv':
      exportToCSV(data, config)
      break
    case 'excel':
      exportToExcel(data, config)
      break
    case 'json':
      exportToJSON(data, config)
      break
    default:
      throw new Error(`不支持的导出格式: ${format}`)
  }
}

/**
 * 下载Blob对象
 */
function downloadBlob(blob: Blob, filename: string) {
  const url = window.URL.createObjectURL(blob)
  const link = document.createElement('a')
  link.href = url
  link.download = filename
  link.style.display = 'none'
  
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
  
  // 释放URL对象
  window.URL.revokeObjectURL(url)
}

/**
 * 格式化日期时间用于导出
 */
export function formatDateTimeForExport(dateTime: string): string {
  if (!dateTime) return ''
  return new Date(dateTime).toLocaleString('zh-CN', {
    year: 'numeric',
    month: '2-digit',
    day: '2-digit',
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit'
  })
}

/**
 * 日志专用导出配置
 */
export const LOG_EXPORT_CONFIG = {
  fields: [
    'title',
    'type',
    'requestUri', 
    'method',
    'remoteAddr',
    'userAgent',
    'params',
    'exception',
    'createTime'
  ],
  headers: [
    '日志标题',
    '日志类型',
    '操作URI',
    '操作方式',
    '用户IP',
    '用户代理',
    '请求参数',
    '异常信息',
    '创建时间'
  ]
}

export default {
  exportData,
  exportToCSV,
  exportToJSON,
  exportToExcel,
  formatDateTimeForExport,
  LOG_EXPORT_CONFIG
} 